#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <errno.h>


enum Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    CLEAR,
    SORT
};

#define DEFAULT_SZ 3
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 25

//人的信息
typedef struct PeoInfo
{
    char name[NAME_MAX];
    short age;
    char sex[SEX_MAX];
    char tele[TELE_MAX];
    char addr[ADDR_MAX];
} PeoInfop;

typedef struct Contact
{
    PeoInfop data[MAX];//存放真实数据的空间
    int sz;//记录有效数据的个数
} Contact;

// 初始化联系人列表
void InitContact(Contact* pcon) {
    pcon->sz = 0;
    // 可以添加更多的初始化操作，比如将数据数组的元素都置为 0 等
    for (int i = 0; i < MAX; ++i) {
        memset(&(pcon->data[i]), 0, sizeof(PeoInfop));
    }
}

// 添加联系人
void AddContact(Contact* pcon) {
    if (pcon->sz >= MAX) {
        printf("联系人列表已满，无法添加！\n");
        return;
    }
    PeoInfop newPerson;
    printf("请输入姓名: ");
    scanf("%s", newPerson.name);
    printf("请输入年龄: ");
    scanf("%hd", &(newPerson.age));
    printf("请输入性别: ");
    scanf("%s", newPerson.sex);
    printf("请输入电话: ");
    scanf("%s", newPerson.tele);
    printf("请输入地址: ");
    scanf("%s", newPerson.addr);
    pcon->data[pcon->sz] = newPerson;
    pcon->sz++;
}

// 删除联系人
void DelContact(Contact* pcon) {
    if (pcon->sz == 0) {
        printf("联系人列表为空，无法删除！\n");
        return;
    }
    char name[NAME_MAX];
    printf("请输入要删除的联系人的姓名: ");
    scanf("%s", name);
    for (int i = 0; i < pcon->sz; ++i) {
        if (strcmp(pcon->data[i].name, name) == 0) {
            // 将后面的联系人信息向前移动
            for (int j = i; j < pcon->sz - 1; ++j) {
                pcon->data[j] = pcon->data[j + 1];
            }
            pcon->sz--;
            printf("联系人已删除！\n");
            return;
        }
    }
    printf("未找到该联系人！\n");
}

// 查找联系人
void FindContact(Contact* pcon) {
    if (pcon->sz == 0) {
        printf("联系人列表为空，无法查找！\n");
        return;
    }
    char name[NAME_MAX];
    printf("请输入要查找的联系人的姓名: ");
    scanf("%s", name);
    for (int i = 0; i < pcon->sz; ++i) {
        if (strcmp(pcon->data[i].name, name) == 0) {
            printf("姓名: %s, 年龄: %hd, 性别: %s, 电话: %s, 地址: %s\n", pcon->data[i].name, pcon->data[i].age, pcon->data[i].sex, pcon->data[i].tele, pcon->data[i].addr);
            return;
        }
    }
    printf("未找到该联系人！\n");
}

// 修改联系人
void ModifyContact(Contact* pcon) {
    if (pcon->sz == 0) {
        printf("联系人列表为空，无法修改！\n");
        return;
    }
    char name[NAME_MAX];
    printf("请输入要修改的联系人的姓名: ");
    scanf("%s", name);
    for (int i = 0; i < pcon->sz; ++i) {
        if (strcmp(pcon->data[i].name, name) == 0) {
            printf("请输入新的姓名: ");
            scanf("%s", pcon->data[i].name);
            printf("请输入新的年龄: ");
            scanf("%hd", &(pcon->data[i].age));
            printf("请输入新的性别: ");
            scanf("%s", pcon->data[i].sex);
            printf("请输入新的电话: ");
            scanf("%s", pcon->data[i].tele);
            printf("请输入新的地址: ");
            scanf("%s", pcon->data[i].addr);
            printf("联系人已修改！\n");
            return;
        }
    }
    printf("未找到该联系人！\n");
}

// 显示联系人列表
void ShowContact(const Contact* pcon) {
    if (pcon->sz == 0) {
        printf("联系人列表为空！\n");
        return;
    }
    for (int i = 0; i < pcon->sz; ++i) {
        printf("姓名: %s, 年龄: %hd, 性别: %s, 电话: %s, 地址: %s\n", pcon->data[i].name, pcon->data[i].age, pcon->data[i].sex, pcon->data[i].tele, pcon->data[i].addr);
    }
}

// 清除联系人列表
void ClearContact(Contact* pcon) {
    pcon->sz = 0;
    // 可以添加更多的清除操作，比如将数据数组的元素都置为 0 等
    for (int i = 0; i < MAX; ++i) {
        memset(&(pcon->data[i]), 0, sizeof(PeoInfop));
    }
    printf("联系人列表已清除！\n");
}

// 对联系人列表进行排序
void SortContact(Contact* pcon) {
    // 这里可以使用简单的冒泡排序，也可以使用 qsort 函数进行更高效的排序
    // 以下是冒泡排序的示例，按照姓名排序
    for (int i = 0; i < pcon->sz - 1; ++i) {
        for (int j = 0; j < pcon->sz - 1 - i; ++j) {
            if (strcmp(pcon->data[j].name, pcon->data[j + 1].name) > 0) {
                PeoInfop temp = pcon->data[j];
                pcon->data[j] = pcon->data[j + 1];
                pcon->data[j + 1] = temp;
            }
        }
    }
    printf("联系人列表已排序！\n");
}

int main() {
    Contact con;
    InitContact(&con);
    int choice;
    do {
        printf("请选择操作：\n");
        printf("1. 添加联系人\n");
        printf("2. 删除联系人\n");
        printf("3. 查找联系人\n");
        printf("4. 修改联系人\n");
        printf("5. 显示联系人列表\n");
        printf("6. 清除联系人列表\n");
        printf("7. 对联系人列表排序\n");
        printf("0. 退出\n");
        scanf("%d", &choice);
        switch (choice) {
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DelContact(&con);
            break;
        case SEARCH:
            FindContact(&con);
            break;
        case MODIFY:
            ModifyContact(&con);
            break;
        case SHOW:
            ShowContact(&con);
            break;
        case CLEAR:
            ClearContact(&con);
            break;
        case SORT:
            SortContact(&con);
            break;
        case EXIT:
            break;
        default:
            printf("无效的选择，请重新输入！\n");
            break;
        }
    } while (choice != EXIT);
    return 0;
}